;(function (w,undefined){
    function init(el){
        // 获取所有的div标签，是一个伪数组
        let els = document.querySelectorAll(el)
        // 遍历伪数组，将伪数组里面的数据赋给构造函数 jQuery ，this指的是实例化对象 jqObj
        els.forEach((item,i) => {
            this[i] = els[i]
        })
        // 给构造函数 jQuery 增加length属性
        this.length = els.length 
    }

    let jQuery = function (el){      
        // 去掉原来 jQuery 构造函数的new，变成了一个普通函数，重新定义一个init方法，将之前jQuery里面的代码全部给init，原型也改成init的原型，然后在jQuery构造函数里面return返回一个new过的init方法
        return new init(el)
    }

    // 给 jQuery 函数增加一个快捷操作，也就是静态方法，该静态方法可以给init构造函数添加原型方法
    jQuery.extend = function (object){              // object = { 方法名(){ },...,方法名(){ } }
        for(let key in object){                     // key是方法名
            init.prototype[key] = object[key]       // 给init原型上增加方法
        }
    }

    // 给init构造函数添加原型方法bg
    $.extend( { bg(){} } )

    // 修改构造函数原型对象
    init.prototype = {
        // 对象简写:去掉冒号和function
        // css:function(cssAttr,cssVal){}
        css(cssAttr,cssVal){
            // 用 for in 遍历实例化对象
            for(let key in this){
                if(key <= 2) this[key].style[cssAttr] = cssVal      // 当对象的键是变量时用数组语法
            }
            return this          // 不写return的话返回undefined，再调用其他css属性方法时会报错
        },
        bg(option){  },
        ajax(option){  },
        attr(option){  },
        addClass(option){  }
    }

    window.jQuery = window.$ = jQuery      // $指的是jQuery
}) (window)



